﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using ProyectoBastanteo.Dominio;
using System.Data.SqlClient;

namespace ProyectoBastanteo.Persistencia
{
    public class ClienteDAO
    {
        private TipoEmpresa oTipo = new TipoEmpresa();
          
        private TipoempresaDAO tipoEmpresaDAO = new TipoempresaDAO (); // Instancia de otro DAO del cual existe dependencia

        public Cliente Crear(Cliente clienteACrear)
        {
            int nuevoCodigo = ObtenerNuevoCodigo();
            string sentencia = "INSERT INTO Clientes VALUES (@codigo, @ruc, @razon, @tipo, @fecha, @empleados)";
            using (SqlConnection conexion = new SqlConnection(Coneccion.ObtenerCadena()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {
                    comando.Parameters.Add(new SqlParameter("@codigo", nuevoCodigo));
                    comando.Parameters.Add(new SqlParameter("@ruc", clienteACrear.rucclie));
                    comando.Parameters.Add(new SqlParameter("@razon", clienteACrear.razclie));
                    comando.Parameters.Add(new SqlParameter("@fecha", clienteACrear.fecini));
                    comando.Parameters.Add(new SqlParameter("@tipo", clienteACrear.tipclie.Codigo));  // OJO
                    comando.Parameters.Add(new SqlParameter("@empleados", clienteACrear.nroempl));
                    comando.ExecuteNonQuery();
                }
            }
          //  return clienteACrear;

           return Obtener(nuevoCodigo);

        }

        public Cliente Obtener(int codigo)
        {
            //oCliente = oClienteDAO.Obtener(102);
            
            Cliente clienteExistente = null;
            string sentencia = "SELECT * FROM Clientes WHERE codclie=@codigo";
            using (SqlConnection conexion = new SqlConnection(Coneccion.ObtenerCadena()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {
                    comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    SqlDataReader resultado = comando.ExecuteReader();
                    if (resultado.Read())
                    {
                        clienteExistente = new Cliente();
                        clienteExistente.codclie = int.Parse(resultado["codclie"].ToString());
                        clienteExistente.rucclie = (string)resultado["rucclie"];
                        clienteExistente.razclie = (string)resultado["razclie"];
                        clienteExistente.fecini = DateTime.Parse(resultado["fecini"].ToString());

                        oTipo = tipoEmpresaDAO.Obtener(int.Parse(resultado["tipclie"].ToString()));
                        clienteExistente.tipclie = oTipo;
                        clienteExistente.nroempl = int.Parse(resultado["nroempl"].ToString());

                        //clienteExistente = new Cliente();
                        //clienteExistente.codclie = (int)resultado["codclie"];
                        //clienteExistente.rucclie = (string)resultado["rucclie"];
                        //clienteExistente.razclie = (string)resultado["razclie"];
                        //clienteExistente.fecini = (DateTime)resultado["fecini"];

                        //clienteExistente.tipclie = tipoEmpresaDAO.Obtener((int)resultado["tipclie"]);
                        //clienteExistente.nroempl = (int)resultado["nroempl"];
                    }
                }
            }
            return clienteExistente;
         }


        public Cliente Modificar(Cliente clienteAModificar)
        {
            string sentencia = "UPDATE Clientes SET rucclie=@ruc, razclie=@razon, fecini=@inicio, tipclie=@tipo, nroempl=@empleados WHERE codclie=@codigo";
            using (SqlConnection conexion = new SqlConnection(Coneccion.ObtenerCadena()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {
                    comando.Parameters.Add(new SqlParameter("@codigo", clienteAModificar.codclie));
                    comando.Parameters.Add(new SqlParameter("@ruc", clienteAModificar.rucclie));
                    comando.Parameters.Add(new SqlParameter("@razon", clienteAModificar.razclie));
                    comando.Parameters.Add(new SqlParameter("@inicio", clienteAModificar.fecini));
                    comando.Parameters.Add(new SqlParameter("@tipo", clienteAModificar.tipclie.Codigo));
                    comando.Parameters.Add(new SqlParameter("@empleados", clienteAModificar.nroempl));
                    comando.ExecuteNonQuery();
                }
            }
            return Obtener(clienteAModificar.codclie);
        }


        public void Eliminar(Cliente clienteAEliminar)
        {
            string sentencia = "DELETE FROM Clientes WHERE codclie=@codigo";
            using (SqlConnection conexion = new SqlConnection(Coneccion.ObtenerCadena()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {
                    comando.Parameters.Add(new SqlParameter("@codigo", clienteAEliminar.codclie));
                    comando.ExecuteNonQuery();
                }
            }
        }


        public ICollection<Cliente> ListarTodos()
        {
            ICollection<Cliente> clientesExistentes = new List<Cliente>();
            Cliente clienteExistente = null;
            string sentencia = "SELECT * FROM Clientes";
            using (SqlConnection conexion = new SqlConnection(Coneccion.ObtenerCadena()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {
                    SqlDataReader resultado = comando.ExecuteReader();
                    while (resultado.Read())
                    {
                        clienteExistente = new Cliente();
                        clienteExistente.codclie = int.Parse(resultado["codclie"].ToString());
                        clienteExistente.rucclie = (string)resultado["rucclie"];
                        clienteExistente.razclie = (string)resultado["razclie"];
                        clienteExistente.fecini = DateTime.Parse(resultado["fecini"].ToString());
                        oTipo = tipoEmpresaDAO.Obtener(int.Parse(resultado["tipclie"].ToString()));
                        clienteExistente.tipclie = oTipo;
                        clienteExistente.nroempl = (int)resultado["nroempl"];
                        clientesExistentes.Add(clienteExistente);
                    }
                }
            }
            return clientesExistentes;
        }

        
        private int ObtenerNuevoCodigo()
        {
            int nuevoCodigo = 0;
            string sentencia = "SELECT max(codclie) FROM Clientes";
            using (SqlConnection conexion = new SqlConnection(Coneccion.ObtenerCadena()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {
                    object valor = comando.ExecuteScalar();
                    if (DBNull.Value.Equals(valor))
                        nuevoCodigo = 1;
                    else
                        nuevoCodigo = (int)valor + 1;
                }
            }
            return nuevoCodigo;
               
        }

        public Cliente ObtenerPorRuc(string ruc)
        {
            Cliente clienteExistente = null;
            string sentencia = "SELECT * FROM clientes WHERE rucclie=@ruc";
            using (SqlConnection conexion = new SqlConnection(Coneccion.ObtenerCadena()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(sentencia, conexion))
                {
                    comando.Parameters.Add(new SqlParameter("@ruc", ruc));
                    SqlDataReader resultado = comando.ExecuteReader();
                    if (resultado.Read())
                    {
                        clienteExistente = new Cliente();
                        clienteExistente.codclie = int.Parse(resultado["codclie"].ToString());
                        clienteExistente.rucclie = (string)resultado["rucclie"];
                        clienteExistente.razclie = (string)resultado["razclie"];
                        clienteExistente.fecini = DateTime.Parse(resultado["fecini"].ToString());

                        oTipo = tipoEmpresaDAO.Obtener(int.Parse(resultado["tipclie"].ToString()));
                        clienteExistente.tipclie = oTipo;
                        clienteExistente.nroempl = int.Parse(resultado["nroempl"].ToString());
                        
                    }
                }
            }
            return clienteExistente;
        }




                 
    }

}